সি প্রোগ্রামিং ভাষায় সর্টিং এবং সার্চিং ফাংশনগুলো ডেটা অর্গানাইজ এবং অনুসন্ধান করতে ব্যবহৃত হয়। এই ফাংশনগুলো মূলত stdlib.h
হেডার ফাইলের অন্তর্গত এবং প্রোগ্রামের ডেটা ম্যানেজমেন্টে বিশেষভাবে কার্যকর। qsort()
এবং bsearch()
ফাংশন সর্টিং এবং সার্চিংয়ের জন্য সবচেয়ে বেশি ব্যবহৃত হয়।
নিচে সি প্রোগ্রামে সর্টিং এবং সার্চিং ফাংশনগুলো এবং তাদের কাজ সম্পর্কে বিস্তারিত আলোচনা করা হলো।
qsort()
– কুইকসোর্ট অ্যালগরিদমের মাধ্যমে সর্টিংqsort()
ফাংশনটি কুইকসোর্ট অ্যালগরিদম ব্যবহার করে একটি অ্যারে সর্ট করতে ব্যবহৃত হয়। এটি একটি জেনেরিক ফাংশন যা যে কোনো ধরনের ডেটা অ্যারে সর্ট করতে সক্ষম। qsort()
ফাংশন সর্টিং প্রক্রিয়ায় কম্পারেটর ফাংশন ব্যবহার করে, যা অ্যারের এলিমেন্টগুলোকে তুলনা করে সর্টিং সম্পন্ন করে।
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));
base
: সর্ট করা অ্যারের প্রথম এলিমেন্টের পয়েন্টার।nitems
: অ্যারের মোট এলিমেন্ট সংখ্যা।size
: প্রতিটি এলিমেন্টের আকার (বাইটে)।compar
: কম্পারেটর ফাংশন যা এলিমেন্টের তুলনা নির্ধারণ করে।#include <stdio.h>
#include <stdlib.h>
// কম্পারেটর ফাংশন
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int main() {
int arr[] = {5, 3, 8, 6, 2};
int n = sizeof(arr) / sizeof(arr[0]);
// অ্যারে সর্ট করা
qsort(arr, n, sizeof(int), compare);
printf("Sorted array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
Output:Sorted array: 2 3 5 6 8
Note:
compare()
ফাংশনটি কম্পারেটর ফাংশন হিসেবে ব্যবহৃত হয়, যাqsort()
কে বলে দেয় কীভাবে এলিমেন্ট তুলনা করে সর্ট করতে হবে।
bsearch()
– বাইনারি সার্চbsearch()
ফাংশনটি একটি সর্ট করা অ্যারেতে নির্দিষ্ট এলিমেন্ট খুঁজে বের করতে ব্যবহৃত হয়। এটি বাইনারি সার্চ অ্যালগরিদম ব্যবহার করে দ্রুত সার্চ সম্পন্ন করে। bsearch()
ফাংশন ব্যবহার করতে হলে অ্যারেটি পূর্বেই সর্ট করা থাকা প্রয়োজন।
void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));
key
: যে মানটি খোঁজা হচ্ছে।base
: অ্যারের প্রথম এলিমেন্টের পয়েন্টার।nitems
: অ্যারের মোট এলিমেন্ট সংখ্যা।size
: প্রতিটি এলিমেন্টের আকার (বাইটে)।compar
: কম্পারেটর ফাংশন যা এলিমেন্টের তুলনা নির্ধারণ করে।#include <stdio.h>
#include <stdlib.h>
// কম্পারেটর ফাংশন
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int key = 3;
// বাইনারি সার্চ
int *found = (int *)bsearch(&key, arr, n, sizeof(int), compare);
if (found != NULL) {
printf("Element %d found at position %ld\n", key, found - arr);
} else {
printf("Element not found.\n");
}
return 0;
}
Output:Element 3 found at position 2
Note:
compare()
ফাংশনটিbsearch()
ফাংশনের জন্য কম্পারেটর হিসেবে কাজ করে।
ফাংশন | কাজ |
---|---|
qsort() | কুইকসোর্ট অ্যালগরিদম ব্যবহার করে সর্টিং করে |
bsearch() | বাইনারি সার্চ ব্যবহার করে নির্দিষ্ট মান খুঁজে বের করে |
qsort()
এবং bsearch()
ফাংশনগুলো সর্টিং এবং সার্চিংয়ের জন্য একটি কম্পারেটর ফাংশন ব্যবহার করে। কম্পারেটর ফাংশনটি দুটি পয়েন্টার আর্গুমেন্ট গ্রহণ করে এবং তাদের তুলনা করে একটি মান রিটার্ন করে। এই মান নির্ধারণ করে যে একটি এলিমেন্ট অন্যটির তুলনায় বড়, ছোট বা সমান কিনা।
a < b
হয়, তাহলে কম্পারেটর ফাংশন একটি নেগেটিভ মান রিটার্ন করে।a == b
হয়, তাহলে কম্পারেটর ফাংশন শূন্য (0) রিটার্ন করে।a > b
হয়, তাহলে কম্পারেটর ফাংশন একটি পজিটিভ মান রিটার্ন করে।int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
এই কম্পারেটর ফাংশনটি qsort()
এবং bsearch()
ফাংশনের জন্য ব্যবহার করা যায়।
সি প্রোগ্রামিং ভাষায় qsort()
এবং bsearch()
ফাংশন দুটি সর্টিং এবং সার্চিংয়ের জন্য খুবই কার্যকর। qsort()
ফাংশনটি কুইকসোর্ট অ্যালগরিদম ব্যবহার করে অ্যারে সর্ট করতে এবং bsearch()
ফাংশনটি সর্ট করা অ্যারেতে নির্দিষ্ট মান খুঁজে বের করতে ব্যবহৃত হয়। এই ফাংশনগুলোতে কম্পারেটর ফাংশন ব্যবহার করে কাস্টম সর্টিং এবং সার্চিং সম্ভব।
stdlib.h
এর সোর্টিং এবং সার্চিং ফাংশনসমূহstdlib.h
হেডার ফাইলটিতে সোর্টিং (Sorting) এবং সার্চিং (Searching) অপারেশন সম্পাদনের জন্য দুটি গুরুত্বপূর্ণ ফাংশন রয়েছে: qsort()
এবং **bsearch()
**। এই ফাংশনগুলো দ্রুত এবং কার্যকরীভাবে এরে বা ডেটা সংগ্রহের উপর কাজ করে, যা প্রোগ্রামের কার্যকারিতা উন্নত করতে সহায়ক।
qsort()
– কুইক সোর্ট ফাংশনqsort()
ফাংশনটি একটি এরে বা ডেটা এলিমেন্টকে কুইক সোর্ট (Quick Sort) পদ্ধতিতে সজ্জিত বা সঠিকভাবে সাজানোর জন্য ব্যবহৃত হয়। এটি যে কোন ধরনের ডেটা টাইপের উপর কাজ করতে সক্ষম এবং এটি কাস্টম কম্পারেটর ফাংশন ব্যবহার করে এরে সাজাতে পারে।
void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));
base
: এরের প্রথম এলিমেন্টের পয়েন্টার।num
: এরের মোট এলিমেন্ট সংখ্যা।size
: প্রতিটি এলিমেন্টের সাইজ (বাইটে)।compar
: কম্পারেটর ফাংশনের পয়েন্টার, যা দুটি এলিমেন্ট তুলনা করতে ব্যবহৃত হয়।নিচের উদাহরণে qsort()
ফাংশন ব্যবহার করে ইন্টিজার এরে সাজানো হয়েছে।
#include <stdio.h>
#include <stdlib.h>
// কম্পারেটর ফাংশন: ছোট থেকে বড় ক্রমে সাজানোর জন্য
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int main() {
int arr[] = {5, 2, 8, 1, 4};
int n = sizeof(arr) / sizeof(arr[0]);
// `qsort()` ফাংশন ব্যবহার করে সজ্জিত করা
qsort(arr, n, sizeof(int), compare);
// সজ্জিত এরে প্রদর্শন
printf("Sorted array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
উপরের উদাহরণে compare()
ফাংশনটি দুটি সংখ্যাকে তুলনা করে এবং ছোট থেকে বড় ক্রমে এরে সাজায়। qsort()
ফাংশনটি একটি জেনেরিক ফাংশন, যা যেকোনো ডেটা টাইপের উপর কাজ করতে সক্ষম, যদি সঠিকভাবে কম্পারেটর ফাংশন সরবরাহ করা হয়।
bsearch()
– বাইনারি সার্চ ফাংশনbsearch()
ফাংশনটি একটি সজ্জিত (sorted) এরে থেকে একটি নির্দিষ্ট এলিমেন্ট খুঁজে বের করতে ব্যবহৃত হয়। এটি বাইনারি সার্চ অ্যালগরিদম ব্যবহার করে কাজ করে, যা দ্রুততম সার্চিং অপারেশনগুলির মধ্যে অন্যতম। এই ফাংশনটি প্রোগ্রামের কার্যকারিতা উন্নত করে, তবে এটি শুধুমাত্র সজ্জিত (sorted) এরে-এর উপর কাজ করে।
void *bsearch(const void *key, const void *base, size_t num, size_t size, int (*compar)(const void *, const void *));
key
: খোঁজা এলিমেন্টের পয়েন্টার।base
: এরে-এর প্রথম এলিমেন্টের পয়েন্টার।num
: এরে-এর মোট এলিমেন্ট সংখ্যা।size
: প্রতিটি এলিমেন্টের সাইজ (বাইটে)।compar
: কম্পারেটর ফাংশনের পয়েন্টার, যা key
এবং এরে এলিমেন্ট তুলনা করতে ব্যবহৃত হয়।নিচের উদাহরণে bsearch()
ফাংশন ব্যবহার করে একটি সজ্জিত ইন্টিজার এরে থেকে নির্দিষ্ট একটি সংখ্যা খোঁজা হয়েছে।
#include <stdio.h>
#include <stdlib.h>
// কম্পারেটর ফাংশন: ছোট থেকে বড় ক্রমে তুলনা করার জন্য
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int main() {
int arr[] = {1, 2, 4, 5, 8};
int n = sizeof(arr) / sizeof(arr[0]);
int key = 4;
// `bsearch()` ফাংশন ব্যবহার করে এলিমেন্ট খোঁজা
int *item = (int *)bsearch(&key, arr, n, sizeof(int), compare);
if (item != NULL) {
printf("Element found: %d\n", *item);
} else {
printf("Element not found\n");
}
return 0;
}
উপরের উদাহরণে, bsearch()
ফাংশনটি key
হিসেবে 4
এর মান খোঁজে এবং যদি তা এরে-এ উপস্থিত থাকে, তাহলে এটি তার পয়েন্টার রিটার্ন করে। যদি এরে-এ key
উপস্থিত না থাকে, তাহলে এটি NULL
রিটার্ন করে।
ফাংশন | কাজ | প্রয়োজন |
---|---|---|
qsort() | এরে বা ডেটা সজ্জিত করে (Quick Sort) | সজ্জিত ডেটা প্রয়োজন |
bsearch() | সজ্জিত ডেটা থেকে নির্দিষ্ট এলিমেন্ট খোঁজে (Binary Search) | সজ্জিত ডেটা |
এই ফাংশনগুলো ব্যবহার করে সি প্রোগ্রামিংয়ে ডেটা সজ্জিত ও খোঁজার কাজ দ্রুত এবং সহজে সম্পন্ন করা যায়।
qsort()
এর মাধ্যমে Array Sortingসি প্রোগ্রামিং ভাষায় qsort()
ফাংশনটি একটি অ্যারে সॉर्ट করার জন্য ব্যবহৃত হয়। এটি stdlib.h
হেডার ফাইলে সংজ্ঞায়িত এবং একটি সাধারণ এবং কার্যকরী সোরটিং এলগরিদম (Quicksort) ব্যবহার করে। qsort()
ফাংশনটি খুব দ্রুত অ্যারে সোর্স করতে পারে এবং এটি কোনও নির্দিষ্ট সিএলএল-ভিত্তিক ফাংশন ব্যবহার করে কাস্টম সোরটিং করতে দেয়।
এখানে qsort()
ফাংশনটি কীভাবে কাজ করে এবং কিভাবে এটি অ্যারে সোর্ট করতে ব্যবহৃত হয় তা বিস্তারিতভাবে আলোচনা করা হলো।
qsort()
সিঙ্কট্যাক্সvoid qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));
base
: অ্যারের পয়েন্টার (অথবা যে মেমোরি ব্লকটি সেভ করা হয়েছে)।num
: অ্যারে বা মেমোরির এলিমেন্টের সংখ্যা।size
: প্রতিটি এলিমেন্টের আকার (বাইটে)।compar
: একটি কাস্টম কম্প্যারিজন ফাংশন, যা দুটি এলিমেন্টের তুলনা করে সেগুলির ক্রম নির্ধারণ করে।qsort()
ফাংশনটি কাস্টম কম্প্যারিজন ফাংশন ব্যবহার করে এলিমেন্টগুলি তুলনা করে। এই ফাংশনটি দুটি পয়েন্টার প্যারামিটার নেয়, এবং একটি ইতিবাচক, নেগেটিভ বা শূন্য মান রিটার্ন করে যা এলিমেন্টগুলির তুলনা নির্ধারণ করে:
-1
): প্রথম পয়েন্টারটি দ্বিতীয়টির আগে থাকবে।0
): দুটি এলিমেন্ট সমান।1
): দ্বিতীয় পয়েন্টারটি প্রথমটির আগে থাকবে।qsort()
ফাংশনটি অ্যারে বা মেমোরি ব্লকটি নেয় এবং compar()
ফাংশনটি ব্যবহার করে এলিমেন্টগুলির তুলনা করে।compar()
ফাংশনটি একটি কাস্টম নিয়মে এলিমেন্টগুলি তুলনা করে এবং তাদের অবস্থান ঠিক করে।qsort()
এর উদাহরণনীচে একটি উদাহরণ দেয়া হলো যেখানে qsort()
ব্যবহার করে একটি ইন্টিজার অ্যারে সোর্ট করা হয়েছে:
#include <stdio.h>
#include <stdlib.h>
// কাস্টম কম্প্যারিজন ফাংশন
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b); // ASCENDING অর্ডারে সোর্টিং
}
int main() {
int arr[] = {12, 45, 23, 4, 90, 56, 78, 67};
size_t n = sizeof(arr) / sizeof(arr[0]);
// অ্যারে সোর্ট করা
qsort(arr, n, sizeof(int), compare);
// সোর্ট করা অ্যারে প্রিন্ট করা
printf("Sorted array: ");
for (size_t i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
Sorted array: 4 12 23 45 56 67 78 90
এখানে, qsort()
ফাংশনটি arr
অ্যারেটি সোর্ট করেছে এবং compare()
ফাংশনটি সোরটিংয়ের জন্য ব্যবহৃত হয়েছে। compare()
ফাংশনটি দুটি ইন্টিজারের পার্থক্য বের করে সেগুলিকে ASCENDING অর্ডারে সাজিয়ে দেয়।
যদি আমরা চান যে অ্যারে ডিসেন্ডিং অর্ডারে সোর্ট হোক, তবে compare()
ফাংশনটিকে একটু পরিবর্তন করতে হবে:
int compare_desc(const void *a, const void *b) {
return (*(int *)b - *(int *)a); // DESCENDING অর্ডারে সোর্টিং
}
এবং qsort()
ফাংশনে compare_desc()
ফাংশনটি ব্যবহার করুন।
qsort()
ফাংশনটি স্ট্রিংও সোর্ট করতে পারে। নিচে একটি স্ট্রিং অ্যারে সোর্ট করার উদাহরণ দেওয়া হলো:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare_strings(const void *a, const void *b) {
return strcmp(*(const char **)a, *(const char **)b); // স্ট্রিং তুলনা
}
int main() {
const char *arr[] = {"Banana", "Apple", "Orange", "Mango", "Grapes"};
size_t n = sizeof(arr) / sizeof(arr[0]);
// স্ট্রিং অ্যারে সোর্ট করা
qsort(arr, n, sizeof(char *), compare_strings);
// সোর্ট করা স্ট্রিং অ্যারে প্রিন্ট করা
printf("Sorted array of strings: ");
for (size_t i = 0; i < n; i++) {
printf("%s ", arr[i]);
}
printf("\n");
return 0;
}
Sorted array of strings: Apple Banana Grapes Mango Orange
এখানে compare_strings()
ফাংশনটি strcmp()
ব্যবহার করে স্ট্রিংগুলি তুলনা করে এবং সেগুলিকে ASCENDING অর্ডারে সজ্জিত করে।
qsort()
ফাংশনটি একটি সাধারণ এবং শক্তিশালী ফাংশন যা অ্যারে বা মেমোরির এলিমেন্টগুলি সোরট করতে ব্যবহৃত হয়। এটি একটি কাস্টম কম্প্যারিজন ফাংশন ব্যবহার করে এলিমেন্টগুলির তুলনা করে এবং বিভিন্ন ধরণের ডেটা টাইপ (যেমন ইন্টিজার, স্ট্রিং, বা কাস্টম স্ট্রাকচার) সুরক্ষিতভাবে সোর্ট করতে পারে।
ফাংশন | কাজ | সিঙ্কট্যাক্স |
---|---|---|
qsort() | অ্যারে বা মেমোরি ব্লক সোরট করা | void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *)); |
compare() | কাস্টম কম্প্যারিজন ফাংশন | int compare(const void *a, const void *b); |
এটি খুবই উপকারী যখন আপনার প্রোগ্রামে ডেটা সোরট করতে হয় এবং আপনি কাস্টম তুলনা লজিক প্রয়োগ করতে চান।
bsearch()
এর মাধ্যমে Binary Searchসি প্রোগ্রামিং ভাষায় bsearch()
ফাংশনটি একটি বিল্ট-ইন ফাংশন যা বাইনারি সার্চ (Binary Search) এলগরিদমের মাধ্যমে সॉর্ট করা অ্যারের মধ্যে একটি উপাদান খুঁজে বের করার জন্য ব্যবহৃত হয়। bsearch()
ফাংশনটি stdlib.h
হেডার ফাইলে ডিফাইন করা থাকে এবং এটি একত্রিতভাবে একটি স.sorted অ্যারে এবং একটি উপাদান অনুসন্ধান করতে সহায়ক।
বাইনারি সার্চ একটি দ্রুত অনুসন্ধান পদ্ধতি যা সিলেক্ট করা তালিকায় উপাদান খুঁজে পেতে O(log n) সময়ে কাজ করে। এই পদ্ধতিতে, প্রথমে তালিকাটির মাঝের উপাদান পরীক্ষা করা হয়। তারপর, তালিকাটি দুটি ভাগে ভাগ করা হয় (যেমন, যদি কাঙ্ক্ষিত উপাদান ছোট হয়, তাহলে তালিকার বাম অংশে খোঁজা হয়, আর যদি বড় হয়, তাহলে ডান অংশে খোঁজা হয়) এবং এই প্রক্রিয়া পুনরাবৃত্তি করা হয় যতক্ষণ না উপাদানটি পাওয়া যায় বা তালিকার শেষ না হয়।
bsearch()
ফাংশনের সিঙ্কট্যাক্স:void *bsearch(const void *key, const void *base, size_t n_items, size_t size, int (*compar)(const void *, const void *));
key
: এটি অনুসন্ধানযোগ্য উপাদান যা আপনি খুঁজছেন।base
: এটি সসর্ড করা অ্যারের সূচক (pointer)।n_items
: অ্যারে এর মধ্যে উপাদানের সংখ্যা।size
: প্রতিটি উপাদানের আকার (বাইটে)।compar
: একটি কাস্টম কম্প্যারিজন ফাংশন যা দুটি উপাদান তুলনা করতে ব্যবহৃত হয়।bsearch()
ফাংশনটি একটি পয়েন্টার রিটার্ন করবে যা সেই উপাদানের অবস্থান নির্দেশ করে।NULL
রিটার্ন করবে।bsearch()
ব্যবহার করে Binary Searchএখানে একটি উদাহরণ দেওয়া হলো, যেখানে bsearch()
ফাংশন ব্যবহার করে একটি সসর্ড অ্যারের মধ্যে একটি উপাদান খোঁজা হয়েছে।
#include <stdio.h>
#include <stdlib.h>
// তুলনা ফাংশন যা bsearch() এর জন্য প্রয়োজন
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b); // দুটি ইন্টিজার তুলনা
}
int main() {
int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
int n = sizeof(arr) / sizeof(arr[0]);
int key = 7;
// bsearch() ফাংশন ব্যবহার করে উপাদান খোঁজা
int *result = (int *)bsearch(&key, arr, n, sizeof(int), compare);
if (result != NULL) {
printf("Element found: %d\n", *result); // উপাদান পাওয়া গেলে তার মান প্রদর্শন
} else {
printf("Element not found\n"); // উপাদান না পাওয়া গেলে
}
return 0;
}
arr[]
: এটি সসর্ড করা অ্যারে যার মধ্যে 10টি উপাদান রয়েছে।compare()
: এটি একটি তুলনা ফাংশন যা দুটি উপাদানকে তুলনা করে। এটি bsearch()
ফাংশনের জন্য প্রয়োজন, কারণ bsearch()
সসর্ড করা অ্যারের মধ্যে একটি উপাদান খোঁজে এবং এটি জানাতে পারে যে কোন উপাদান ছোট, বড়, বা সমান।bsearch()
: এটি key
(যা খুঁজে বের করতে হবে) এবং arr
(সসর্ড করা অ্যারে) এর মধ্যে n
(উপাদানের সংখ্যা) এবং sizeof(int)
(প্রতিটি উপাদানের আকার) পাস করা হয়।key
অ্যারেতে পাওয়া যায়, তবে bsearch()
তার অবস্থান নির্দেশকারী পয়েন্টার রিটার্ন করবে। অন্যথায়, এটি NULL
রিটার্ন করবে।Element found: 7
যেহেতু 7 অ্যারেতে আছে, তাই এটি সেই উপাদানটি রিটার্ন করবে।
bsearch()
ফাংশনটি বাইনারি সার্চ পদ্ধতিতে একটি সসর্ড অ্যারে থেকে একটি উপাদান খুঁজে বের করার জন্য ব্যবহৃত হয়।key
(যে উপাদানটি খুঁজে বের করতে চান) এবং base
(সসর্ড অ্যারে) সহ আরো কিছু আর্গুমেন্ট গ্রহণ করে।compare()
ফাংশনটি bsearch()
ফাংশনের জন্য প্রয়োজন, যা দুটি উপাদান তুলনা করতে ব্যবহৃত হয়।bsearch()
একটি শক্তিশালী এবং দক্ষ উপায় অ্যারের মধ্যে ত্রুটিমুক্তভাবে উপাদান খুঁজে বের করার জন্য।
সি প্রোগ্রামিংয়ে কাস্টম সর্টিং এবং কাস্টম সার্চিং টেকনিক্স ব্যবহার করে আপনি নির্দিষ্ট শর্ত অনুযায়ী ডেটা সর্ট এবং সার্চ করতে পারেন। সাধারণ সর্টিং এবং সার্চিং ফাংশন যেমন qsort()
এবং bsearch()
ব্যবহার করা হলেও, কখনও কখনও আপনার নির্দিষ্ট কাস্টম শর্তে ডেটা সর্ট বা সার্চ করতে হতে পারে। সেক্ষেত্রে, কাস্টম কম্পারেটর ফাংশন এবং কাস্টম সার্চ পদ্ধতি ব্যবহার করতে পারেন।
নিচে কাস্টম সর্টিং এবং সার্চিং টেকনিক্সের বিস্তারিত আলোচনা করা হলো।
সি ভাষায় qsort()
ফাংশনটি জেনেরিক সর্টিং ফাংশন যা কাস্টম কম্পারেটর ফাংশন ব্যবহার করে কোনো অ্যারের এলিমেন্টকে সর্ট করতে সহায়ক। আপনি যখন নির্দিষ্ট কোনো শর্তে সর্ট করতে চান, তখন একটি কাস্টম কম্পারেটর ফাংশন তৈরি করতে পারেন।
ধরা যাক, আমরা একটি অ্যারে সর্ট করতে চাই, তবে সর্টিংটি হবে উল্টোভাবে অর্থাৎ বড় সংখ্যাগুলি আগে আসবে (ডিসেনডিং অর্ডার)।
int compare(const void *a, const void *b);
#include <stdio.h>
#include <stdlib.h>
// কাস্টম কম্পারেটর ফাংশন
int compare(const void *a, const void *b) {
return (*(int *)b - *(int *)a); // Descending order (বড় থেকে ছোট)
}
int main() {
int arr[] = {12, 5, 3, 8, 1};
int n = sizeof(arr) / sizeof(arr[0]);
// qsort ব্যবহার করে সর্ট করা
qsort(arr, n, sizeof(int), compare);
printf("Sorted array in descending order: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
Output:Sorted array in descending order: 12 8 5 3 1
এখানে
compare()
ফাংশনটিqsort()
ফাংশনের জন্য কাস্টম কম্পারেটর হিসেবে কাজ করেছে এবং সংখ্যাগুলিকে বড় থেকে ছোটে সর্ট করা হয়েছে।
ধরা যাক, আমাদের একটি স্ট্রিং এর অ্যারে আছে এবং আমরা স্ট্রিংগুলিকে তাদের দৈর্ঘ্য অনুযায়ী সর্ট করতে চাই (ছোট থেকে বড় বা বড় থেকে ছোট)। এখানে strlen()
ফাংশন ব্যবহার করতে হবে।
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// কাস্টম কম্পারেটর ফাংশন
int compare(const void *a, const void *b) {
return strlen((const char *)a) - strlen((const char *)b); // String length comparison
}
int main() {
char *arr[] = {"apple", "kiwi", "banana", "grape"};
int n = sizeof(arr) / sizeof(arr[0]);
// qsort ব্যবহার করে সর্ট করা
qsort(arr, n, sizeof(char *), compare);
printf("Sorted array based on string length: ");
for (int i = 0; i < n; i++) {
printf("%s ", arr[i]);
}
return 0;
}
Output:Sorted array based on string length: kiwi grape apple banana
এখানে স্ট্রিংগুলির দৈর্ঘ্য অনুযায়ী তাদের সর্ট করা হয়েছে, ছোট স্ট্রিং প্রথমে আসছে।
যখন আপনি একটি অ্যারেতে কাস্টম সার্চ করতে চান, তখন আপনি bsearch()
ফাংশনের পরিবর্তে নিজের সার্চ ফাংশন তৈরি করতে পারেন। এটি সাধারণত তখনই দরকার হয় যখন সার্চিংয়ের শর্ত কাস্টম হয় (যেমন, কোন নির্দিষ্ট বৈশিষ্ট্য অনুযায়ী সার্চ করা)।
ধরা যাক, আমাদের একটি অ্যারে আছে এবং আমরা একটি নির্দিষ্ট শর্তের অধীনে একটি মান খুঁজতে চাই (যেমন, অ্যারের মধ্যে এমন একটি মান খুঁজতে যা ৩ দ্বারা বিভাজ্য।)
int custom_search(int arr[], int n, int target);
#include <stdio.h>
int custom_search(int arr[], int n, int target) {
for (int i = 0; i < n; i++) {
if (arr[i] % target == 0) { // Check if divisible by target
return i; // Return index
}
}
return -1; // Return -1 if not found
}
int main() {
int arr[] = {12, 15, 7, 20, 25};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 5;
int index = custom_search(arr, n, target);
if (index != -1) {
printf("Element divisible by %d found at index %d\n", target, index);
} else {
printf("No element divisible by %d found\n", target);
}
return 0;
}
Output:Element divisible by 5 found at index 0
এখানে
custom_search()
ফাংশনটি এমন একটি মান খুঁজে বের করেছে যা ৫ দ্বারা বিভাজ্য।
যদি অ্যারে সর্ট করা থাকে এবং আপনি নির্দিষ্ট শর্তে বাইনারি সার্চ করতে চান, তবে একটি কাস্টম বাইনারি সার্চ ফাংশন তৈরি করা যেতে পারে। এখানে bsearch()
ফাংশনের ব্যবহার না করে বাইনারি সার্চ কাস্টম শর্তে করা হয়েছে।
ধরা যাক, আপনি এমন একটি অ্যারে খুঁজতে চান যেখানে যেকোনো পজিটিভ সংখ্যা ১০ এর থেকে বড় হতে হবে এবং সেই মানটি সঠিক স্থান থেকে বের করা হবে।
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b); // Ascending order comparison
}
int binary_search(int arr[], int size, int key) {
int low = 0, high = size - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (arr[mid] == key) {
return mid;
} else if (arr[mid] < key) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
int main() {
int arr[] = {2, 5, 8, 10, 15};
int size = sizeof(arr) / sizeof(arr[0]);
qsort(arr, size, sizeof(int), compare);
int key = 10;
int index = binary_search(arr, size, key);
if (index != -1) {
printf("Element %d found at index %d\n", key, index);
} else {
printf("Element not found\n");
}
return 0;
}
Output:Element 10 found at index 3
এখানে কাস্টম বাইনারি সার্চ ফাংশনটি সর্ট করা অ্যারেতে নির্দিষ্ট মান খুঁজে বের করেছে।
টেকনিক | বর্ণনা |
---|---|
কাস্টম কম্পারেটর ফাংশন | qsort() ব্যবহার করে কাস্টম শর্তে সর্ট করা (যেমন: বড় থেকে ছোট, স্ট্রিং দৈর্ঘ্য অনুযায়ী) |
কাস্টম সার্চ ফাংশন | অ্যারে বা লিস্টে কাস্টম শর্ত অনুযায়ী সার্চ (যেমন: শর্ত পূরণকারী মান খোঁজা) |
কাস্টম বাইনারি সার্চ | বাইনারি সার্চের মাধ্যমে সর্ট করা অ্যারেতে কাস্টম শর্তে দ্রুত অনুসন্ধান |
সি প্রোগ্রামে কাস্টম সর্টিং এবং সার্চিং ফাংশনগুলো ডেটা ম্যানিপুলেশন এবং ফলস্বরূপ ফলাফল পেতে খুবই কার্যকরী। এই ফাংশনগুলোর মাধ্যমে আপনি আপনার নির্দিষ্ট প্রয়োজন অনুসারে ডেটা ম্যানেজমেন্ট সহজে করতে পারেন।
common.read_more